﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebAppPlanProduccion.Code;
using WebAppPlanProduccion.Code.Security;
using Web.Framework;

using PlanProd.Contracts.Search;
using PlanProd.Contracts;
using Web.Framework.Svc;
using System.IO;
using System.Text;
using PlanProd.ServiceFactory;
using WebAppPlanProduccion.Code.Search;
using Web.Framework.Search;

namespace WebAppPlanProduccion.App
{
    public partial class ProductoList : BasePage
    {
        private ServiceOptions searchOptions
        {
            get
            {
                return (ServiceOptions)ViewState["searchOptions"];
            }
            set
            {
                ViewState["searchOptions"] = value;
            }
        }

        private SearchProductCriteria searchProductCriteria
        {
            get
            {
                return (SearchProductCriteria)ViewState["searchProductCriteria"];
            }
            set
            {
                ViewState["searchProductCriteria"] = value;
            }
        }

        public ProductoSearchObj ProductoSearchObjProvider = new ProductoSearchObj();

        SearchProductResult SearchProductResult
        {
            get
            {
                return (SearchProductResult)ViewState["SearchProductResult"];
            }
            set
            {
                ViewState["SearchProductResult"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                try
                {
                    HasPermissionToSeeMe(PlanProdSecurity.PRODUCTO_VER);
                    if (!this.IsPostBack)
                    {
                        UIHelper.LoadTemporadas(this.cboTemporada, "Todas");
                        UIHelper.LoadCalidad(this.cboCalidad, "Todas");
                    }
                }
                catch (Exception ex)
                {
                    ExceptionManager.Instance.HandleException(ex);
                }
            }
        }

        protected override void ApplySecurity()
        {
            //this.lnkSincronizar.Visible = HasPermissionFor(PlanProdSecurity.PRODUCTO_SINCRONIZAR);
            this.pnlImportar.Visible = HasPermissionFor(PlanProdSecurity.PRODUCTOS_IMPORTAR);
        }

        protected void lnkBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                Buscar();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkSincronizarTodo_Click(object sender, EventArgs e)
        {
            try
            {
                List<Producto> productosResultado = WebServiceHelper.ActualizarProductosMasivo(searchProductCriteria);

                StringBuilder mensajeBuilder = new StringBuilder();

                foreach (Producto productoResultado in productosResultado)
                {
                    mensajeBuilder.AppendFormat("{0}{1}: {2}", productoResultado.ProductoIdExterno, productoResultado.ColorIdExterno, productoResultado.ErrorMsg);
                    mensajeBuilder.Append("<br />");
                }

                masterPage.ShowMessage(mensajeBuilder.ToString(), WebMessageType.Notification);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        //protected void lnkSincronizar_Click(object sender, EventArgs e)
        //{
        //    //try
        //    //{
        //    //    Buscar();
        //    //}
        //    //catch (Exception ex)
        //    //{
        //    //    ExceptionManager.Instance.HandleException(ex);
        //    //}
        //}        

        protected void GridProductos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                this.GridProductos.PageIndex = e.NewPageIndex;

                BindGrid();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridProductos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    int productoId = Convert.ToInt32(this.GridProductos.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    this.Response.Redirect(string.Format("/App/ProductoEdit.aspx?Id={0}", productoId), true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridProductos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
        }

        protected void GridProductos_DataBound(object sender, EventArgs e)
        {
            try
            {
                if (ProductoSearchObjProvider != null && ProductoSearchObjProvider.SearchResult != null)
                {
                    SearchProductResult = ProductoSearchObjProvider.SearchResult;
                    this.lblTotalProductos.Text = ProductoSearchObjProvider.SearchResult.Count.ToString();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void CustomerObjectDs_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            try
            {
                GridViewSearchObjectDataSource searchProvider = new GridViewSearchObjectDataSource();

                this.ProductoSearchObjProvider = new ProductoSearchObj();
                this.ProductoSearchObjProvider.SearchParam = searchProductCriteria;
                this.ProductoSearchObjProvider.ServiceOptions = searchOptions;
                this.ProductoSearchObjProvider.WebServiceHelper = this.WebServiceHelper;

                searchProvider.Provider = this.ProductoSearchObjProvider;

                e.ObjectInstance = searchProvider;
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void Buscar()
        {
            int paginas = Convert.ToInt32(this.txtPaginas.Text);
            this.hidCheckedRows.Value = string.Empty;
            this.GridProductos.PageSize = paginas;

            searchOptions = new ServiceOptions();
            searchOptions.PageNumber = GridProductos.PageIndex;
            searchOptions.PageSize = GridProductos.PageSize;
            var securityContext = GetSecurityContextForDestinos();
            searchOptions.IsAdmin = BaseWebPage.IsAdmin;
            searchOptions.Operations = securityContext.Operations;
            searchOptions.CompanyId = BaseWebPage.CompanyId;

            searchProductCriteria = new SearchProductCriteria();
            searchProductCriteria.EmpresaId = BaseWebPage.CompanyId;
            searchProductCriteria.CodigoProducto = this.txtProducto.Text;
            searchProductCriteria.CodigoColor = this.txtColor.Text;
            searchProductCriteria.TemporadaId = UIHelper.GetIntFromInputCbo(cboTemporada);
            searchProductCriteria.CalidadId = UIHelper.GetIntFromInputCbo(cboCalidad);
            searchProductCriteria.FechasincDesde = UIHelper.GetDateTimeFromInputText(this.txtFechaDesde.Text);
            searchProductCriteria.FechasincHasta = UIHelper.GetDateTimeFromInputText(this.txtFechaHasta.Text);
            //List<Producto> productos = WebServiceHelper.SearchProducts(searchOptions, productSearchCriteria);

            //this.GridProductos.DataSource = productos;
            //this.GridProductos.DataBind();

            BindGrid();

            pnlResults.Visible = true;
            pnlAllResults.Visible = true;
        }

        private void BindGrid()
        {
            this.GridProductos.DataSourceID = "CustomerObjectDs";
        }

        protected void lnkGuardarArchivoParaSincSap_Click(object sender, EventArgs e)
        {
            string filePath = string.Empty;
            try
            {
                if (this.FileUploadProductoParaSap.HasFile)
                {
                    string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                    string fileName = Guid.NewGuid().ToString();
                    filePath = Path.Combine(tmpPath, fileName);
                    this.FileUploadProductoParaSap.SaveAs(filePath);
                    List<string> parseErrors = new List<string>();

                    // Cargar objetos de producto color
                    List<Producto> productoList = ExcelHelper.GetProductosFromExcelFromCodigoColor(filePath, parseErrors);

                    if (parseErrors.Count == 0)
                    {
                        IPlanProdAdmin service = ServiceFactory.GetPlanProdAdminService();
                        productoList.ForEach(p => { p.EmpresaId = BasePage.CompanyId; });
                        // Sincronizar
                        StringBuilder mensajeBuilder = ActualizarProductosConSap(productoList);
                        masterPage.ShowMessage(mensajeBuilder.ToString(), WebMessageType.Notification);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();
                        string separador = string.Empty;
                        foreach (string parseError in parseErrors)
                        {
                            builder.Append(separador);
                            builder.AppendLine(parseError);
                            separador = "<br />";
                        }

                        masterPage.ShowMessage(builder.ToString(), WebMessageType.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }

        protected void lnkImportar_Click(object sender, EventArgs e)
        {
            string filePath = string.Empty;
            try
            {
                if (this.fileProductos.HasFile)
                {
                    string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                    string fileName = Guid.NewGuid().ToString();
                    filePath = Path.Combine(tmpPath, fileName);
                    this.fileProductos.SaveAs(filePath);
                    List<string> parseErrors = new List<string>();

                    // Cargar objetos de producto color
                    List<Producto> productoList = ExcelHelper.GetProductosFromExcel(filePath, parseErrors);

                    if (parseErrors.Count == 0)
                    {
                        IPlanProdAdmin service = ServiceFactory.GetPlanProdAdminService();
                        productoList.ForEach(p => { p.EmpresaId = BasePage.CompanyId; });
                        service.SaveProductos(WebServiceHelper.ServiceOptionsDefault, productoList);
                        masterPage.ShowMessage("Los productos se generaron correctamente", WebMessageType.Notification);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();
                        string separador = string.Empty;
                        foreach (string parseError in parseErrors)
                        {
                            builder.Append(separador);
                            builder.AppendLine(parseError);
                            separador = "<br />";
                        }

                        masterPage.ShowMessage(builder.ToString(), WebMessageType.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }

        protected void lnkActualizarProductosSeleccionados_Click(object sender, EventArgs e)
        {
            try
            {
                List<int> selectedRowsIds = new List<int>();
                if (!String.IsNullOrEmpty(this.hidCheckedRows.Value))
                {
                    string[] ids = this.hidCheckedRows.Value.Split('#');

                    foreach (string id in ids)
                    {
                        if (!String.IsNullOrEmpty(id))
                        {
                            int idInt = Convert.ToInt32(id);
                            if (!selectedRowsIds.Contains(idInt))
                            {
                                selectedRowsIds.Add(idInt);
                            }
                        }
                    }

                    // Una vez que tengo la lista, envio a sincronizar los productos
                    // Como supuestamente quedan en la página los productos los puedo seleccionar
                    List<Producto> productosAActualizar = new List<Producto>();

                    foreach (int productoId in selectedRowsIds)
                    {
                        var producto = SearchProductResult.Productos.Where(p => p.Id == productoId).SingleOrDefault();
                        if (producto != null)
                        {
                            productosAActualizar.Add(producto);
                        }
                    }

                    // Actualizar productos contra SAP
                    StringBuilder mensajeBuilder = ActualizarProductosConSap(productosAActualizar);

                    this.masterPage.ShowMessage(mensajeBuilder.ToString(), WebMessageType.Notification);
                    //this.hidCheckedRows.Value = string.Empty;
                    Buscar();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private StringBuilder ActualizarProductosConSap(List<Producto> productosAActualizar)
        {
            List<Producto> productosResultado = WebServiceHelper.ActualizarProductos(productosAActualizar, BaseWebPage.CompanyId);

            StringBuilder mensajeBuilder = new StringBuilder();

            foreach (Producto productoResultado in productosResultado)
            {
                mensajeBuilder.AppendFormat("{0}{1}: {2}", productoResultado.ProductoIdExterno, productoResultado.ColorIdExterno, productoResultado.ErrorMsg);
                mensajeBuilder.Append("<br />");
            }
            return mensajeBuilder;
        }
    }
}